﻿//给你一个 n 个视频的上传序列，每个视频编号为 1 到 n 之间的 不同 数字，你需要依次将这些视频上传到服务器。请你实现一个数据结构，在上传的过程中计算 最长上传前缀 。
//
//如果 闭区间 1 到 i 之间的视频全部都已经被上传到服务器，那么我们称 i 是上传前缀。最长上传前缀指的是符合定义的 i 中的 最大值 。
//
//请你实现 LUPrefix 类：
//
//LUPrefix(int n) 初始化一个 n 个视频的流对象。
//void upload(int video) 上传 video 到服务器。
//int longest() 返回上述定义的 最长上传前缀 的长度。
//
//
//来源：力扣（LeetCode）
//链接：https ://leetcode.cn/problems/longest-uploaded-prefix
//著作权归领扣网络所有。商业转载请联系官方授权，非商业转载请注明出处。
/*
对象结构定义。
mark:       bool类型的标记数组，为true表示对应的视频已经上传。
markSize:   mark数组的总长度，等于输入值n。
lup:        从左往右第一个值等于false的mark[]下标，全为true的时候就等于n。
*/
typedef struct
{
    bool* mark;
    int markSize;
    int lup;
}
LUPrefix;

/*
创建对象。
lup初始化为0，表示一开始时没有任何视频上传。
markSize就等于输入的n。
mark数组用calloc代替malloc申请空间，即包含了初始化全为false的步骤。
*/
LUPrefix* lUPrefixCreate(int n)
{
    LUPrefix* obj = (LUPrefix*)malloc(sizeof(LUPrefix));
    obj->lup = 0;
    obj->markSize = n;
    obj->mark = (bool*)calloc(n, sizeof(bool));
    return obj;
}

/*
上传视频。
把对应的mark[]置为true即可。
注意video要减一，是因为数组下标从0开始，而video编号从1开始。
*/
void lUPrefixUpload(LUPrefix* obj, int video)
{
    obj->mark[video - 1] = true;
    return;
}

/*
查询最长上传前缀。
把lup往右挪到第一个mark[]等于false的下标处。
由于video编号从1开始，数组下标从0开始，所以此时的lup正好就等于题目要求的最长上传前缀。
*/
int lUPrefixLongest(LUPrefix* obj)
{
    while (obj->markSize > obj->lup && true == obj->mark[obj->lup])
    {
        obj->lup++;
    }
    return obj->lup;
}

/*
释放对象。
*/
void lUPrefixFree(LUPrefix* obj)
{
    free(obj->mark);
    free(obj);
    return;
}
